package com.fkcai.hansoul.controller;

import com.fkcai.hansoul.common.exception.ComFoundException;
import com.fkcai.hansoul.common.util.*;
import com.fkcai.hansoul.model.dto.user.*;
import com.fkcai.hansoul.model.entity.User;

import com.fkcai.hansoul.model.vo.user.UserBasicVo;
import com.fkcai.hansoul.model.vo.user.UserFullVo;
import com.fkcai.hansoul.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.time.LocalDate;
import java.util.Map;

/**
 * 用户控制器类
 * 提供用户相关的 RESTful API操作
 */
@RestController
@RequestMapping("/api/user")
public class UserController {
	@Autowired
	private UserService userService;
	@Autowired
	private OssUtil ossUtil;
	
	
	/**
	 * 从 Token 中获取当前用户 id
	 *
	 * @return 当前用户 id
	 */
	private Integer getCurrentUserId () {
		return Integer.parseInt(ThreadLocalUtil.get().toString());
	}
	
	
	/**
	 * 注册接口
	 *
	 * @param user 用户基础 dto
	 * @return 用户注册成功与否信息
	 */
	@PostMapping("/register")
	public Result<UserBasicVo> register (@RequestBody UserBasicDto user) {
		UserBasicVo data = userService.registerUser(user.getPhone(), user.getPassword());
		
		return Result.success(data);
	}
	
	
	/**
	 * 登录接口
	 *
	 * @param user 用户基础 dto
	 * @return 用户登录成功与否信息
	 */
	@PostMapping("/login")
	public Result<UserBasicVo> loginUser (@RequestBody UserBasicDto user) {
		UserBasicVo data = userService.loginUser(user.getPhone(), user.getPassword());
		
		// 生成 token
		String token = JwtUtil.generateToken(data.getUserId().toString());
		data.setToken(token);
		
		return Result.success(data);
	}
	
	
	/**
	 * 忘记密码接口
	 *
	 * @param user 包含手机号、验证码和新密码
	 * @return 返回密码重置结果
	 */
	@PostMapping("/forgetPassword")
	public Result<UserBasicVo> forgetPassword (@RequestBody ForgetPasswordDTO user) {
		UserBasicVo data = userService.forgetPassword(user.getPhone(), user.getVerificationCode(), user.getNewPassword());
		
		return Result.success(data);
	}
	
	
	/**
	 * 修改密码接口
	 *
	 * @param user 包含手机号、旧密码、验证码和新密码
	 * @return 返回密码修改成功信息
	 */
	@PostMapping("/updatePassword")
	public Result<UserBasicVo> updatePassword (@RequestBody UpdatePasswordDTO user) {
		UserBasicVo data = userService.updatePassword(user.getPhone(), user.getOldPassword(), user.getVerificationCode(), user.getNewPassword());
		
		return Result.success(data);
	}
	
	
	/**
	 * 获取用户详细信息接口
	 *
	 * @param userId 用户 id
	 * @return 用户详细信息
	 */
	@GetMapping("userInfo/{userId}")
	public Result<UserFullVo> getUserInfo (@PathVariable Integer userId) {
		UserFullVo data = userService.getUserInfo(userId);
		
		return Result.success(data);
		
	}
	
	
	/**
	 * 用户上传头像接口
	 *
	 * @param file 头像文件
	 * @return 返回上传成功与否信息
	 */
	@PostMapping("/uploadAvatar")
	public Result<String> updateUserAvatar (@RequestParam("file") MultipartFile file) {
		// 从 ThreadLocal 中获取用户 ID
		Integer userId = getCurrentUserId();
		
		if (file.isEmpty()) {
			return Result.fail(ResultCode.FILE_NOT_NULL);
		}
		
		// 获取文件名和拓展名
		String fileNam = file.getOriginalFilename();
		String fileExtension = fileNam.substring(fileNam.lastIndexOf(".") + 1);
		
		// 设置允许的文件类型
		String[] allowedExtension = {"jpg", "png", "jpeg", "gif"};
		for (String ext : allowedExtension) {
			if (fileExtension.equalsIgnoreCase(ext)) {
				try {
					// 生成 OSS 存储路径
					String objectName = "avatars/user_" + userId + "/" + System.currentTimeMillis() + "." + fileExtension;
					// 上传到 OSS
					String url = ossUtil.uploadFile(file.getInputStream(), objectName);
					
					// 更新用户头像 URL
					User user = new User();
					user.setUserId(userId);
					user.setAvatarUrl(url);
					userService.updateUserAvatar(userId, url);
					
					return Result.success();
				} catch (IOException e) {
					return Result.fail(ResultCode.FILE_UPLOAD_ERROR);
				}
			}
		}
		
		return Result.fail(ResultCode.FILE_FORMAT_ERROR);
	}
	
	
	/**
	 * 用户上传头像接口
	 *
	 * @param file 头像文件
	 * @return 返回上传成功与否信息
	 */
	@PostMapping("/uploadCover")
	public Result<String> updateUserCover (@RequestParam("file") MultipartFile file) {
		// 从 ThreadLocal 中获取用户 ID
		Integer userId = getCurrentUserId();
		
		if (file.isEmpty()) {
			return Result.fail(ResultCode.FILE_NOT_NULL);
		}
		
		// 获取文件名和拓展名
		String fileNam = file.getOriginalFilename();
		String fileExtension = fileNam.substring(fileNam.lastIndexOf(".") + 1);
		
		// 设置允许的文件类型
		String[] allowedExtension = {"jpg", "png", "jpeg", "gif"};
		for (String ext : allowedExtension) {
			if (fileExtension.equalsIgnoreCase(ext)) {
				try {
					// 生成 OSS 存储路径
					String objectName = "covers/user_" + userId + "/" + System.currentTimeMillis() + "." + fileExtension;
					// 上传到 OSS
					String url = ossUtil.uploadFile(file.getInputStream(), objectName);
					
					// 更新用户头像 URL
					User user = new User();
					user.setUserId(userId);
					user.setCoverUrl(url);
					userService.updateUserCover(userId, url);
					
					return Result.success();
				} catch (IOException e) {
					return Result.fail(ResultCode.FILE_UPLOAD_ERROR);
				}
			}
		}
		
		return Result.fail(ResultCode.FILE_FORMAT_ERROR);
	}
	
	
	/**
	 * 用户修改昵称接口
	 *
	 * @param user 包含用户名
	 * @return 返回修改成功与否信息
	 */
	@PostMapping("/updateUsername")
	public Result<String> updateUsername (@RequestBody UserProfileEditingDto user) {
		userService.updateUsername(getCurrentUserId(), user.getUsername());
		
		return Result.success();
	}
	
	
	/**
	 * 用户修改性别接口
	 *
	 * @param user 包含用户性别
	 * @return 返回用户性别修改成功与否信息
	 */
	@PostMapping("/updateGender")
	public Result<String> updateGender (@RequestBody UserProfileEditingDto user) {
		userService.updateGender(getCurrentUserId(), user.getGender());
		
		return Result.success();
	}
	
	
	/**
	 * 用户修改生日接口
	 *
	 * @param user 包含用户生日
	 * @return 用户修改生日成功与否信息
	 */
	@PostMapping("/updateBirthday")
	public Result<String> updateBirthday (@RequestBody UserProfileEditingDto user) {
		userService.updateBirthday(getCurrentUserId(), user.getBirthday());
		
		return Result.success();
	}
	
	
	/**
	 * 用户修改地区接口
	 *
	 * @param user 包含用户地区
	 */
	@PostMapping("/updateLocation")
	public Result<String> updateLocation (@RequestBody UserProfileEditingDto user) {
		userService.updateLocation(getCurrentUserId(), user.getLocation());
		
		return Result.success();
	}
	
	
	/**
	 * 用户修简介接口
	 *
	 * @param user 包含用户简介
	 */
	@PostMapping("/updateBio")
	public Result<String> updateBio (@RequestBody UserProfileEditingDto user) {
		userService.updateBio(getCurrentUserId(), user.getBio());
		
		return Result.success();
	}
}
